package com.liliudong.template.biz.service.sys;

import cn.hutool.core.lang.tree.Tree;
import com.liliudong.template.common.constant.DataScopeConst;
import com.liliudong.template.common.request.sys.SysMenuAddRequest;
import com.liliudong.template.common.request.sys.SysMenuModifyRequest;
import com.liliudong.template.common.request.sys.SysMenuPageRequest;
import com.liliudong.template.common.entity.sys.SysMenu;
import com.liliudong.template.common.response.sys.SysMenuDetailResponse;
import com.liliudong.template.common.response.sys.SysMenuPageResponse;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryChain;
import com.mybatisflex.core.service.IService;

import java.util.List;
import java.util.Set;

import static com.liliudong.template.common.entity.sys.table.SysMenuTableDef.SYS_MENU;

/**
 * 系统菜单 服务层。
 *
 * @author liudo
 * @since 2024-07-30
 */
public interface SysMenuService extends IService<SysMenu> {

    default QueryChain<SysMenu> queryChainIgnoreDataPermission() {
        return queryChain()
                .from(SYS_MENU.as(DataScopeConst.IGNORE_TABLE_ALIAS));
    }

    /**
     * 根据角色id列出忽略数据权限
     *
     * @param roleIds
     * @param isAdmin
     * @return
     */
    Set<String> listPermissionByRoleIdsIgnoreDataPermission(Set<Long> roleIds, boolean isAdmin);

    /**
     * 按角色分类树id忽略数据权限
     *
     * @param roleIds 角色ID
     * @param isAdmin 是管理员
     * @return {@link List }<{@link Tree }<{@link Long }>>
     */
    List<Tree<Long>> treeByRoleIdsIgnoreDataPermission(Set<Long> roleIds, boolean isAdmin);

    /**
     * 添加
     *
     * @param sysMenuAddRequest 新增dto
     */
    void addOne(SysMenuAddRequest sysMenuAddRequest);

    /**
     * 删除
     *
     * @param id 主键
     */
    void deleteById(Long id);

    /**
     * 修改
     *
     * @param id 主键
     * @param sysMenuModifyRequest 更新dto
     */
    void modifyById(Long id, SysMenuModifyRequest sysMenuModifyRequest);

    /**
     * 详情
     *
     * @param id 主键
     * @return {@link SysMenuDetailResponse }
     */
    SysMenuDetailResponse detailById(Long id);

    /**
     * 分页
     *
     * @param page           页面
     * @param size           大小
     * @param sysMenuPageRequest dto
     * @return {@link Page< SysMenuPageResponse > }
     */
    Page<SysMenuPageResponse> queryPage(Long page, Long size, SysMenuPageRequest sysMenuPageRequest);

    /**
     * 查询树
     *
     * @return {@link List }<{@link Tree }<{@link Long }>>
     */
    List<Tree<Long>> queryTree();

}
